package class202205.demo31.demo27.lambdademo;

import java.util.Comparator;
import java.util.PriorityQueue;

/**
 * 叫做函数式接口
 */
@FunctionalInterface  //注解  函数式接口  只允许一个抽象方法
interface NoParameterNoReturn {
    //只有一个抽象方法  叫做函数式接口
    void test();
}

//无返回值一个参数
@FunctionalInterface
interface OneParameterNoReturn {
    void test(int a);
}

//无返回值多个参数
@FunctionalInterface
interface MoreParameterNoReturn {
    void test(int a, int b);
}

//有返回值无参数
@FunctionalInterface
interface NoParameterReturn {
    int test();

}

//有返回值一个参数
@FunctionalInterface
interface OneParameterReturn {
    int test(int a);
}

//有返回值多参数
@FunctionalInterface
interface MoreParameterReturn {
    int test(int a, int b);
}

public class TestDemo {

    public static void main(String[] args) {
        PriorityQueue<Integer> minHeap = new PriorityQueue<>(3, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return 0;
            }
        });

        PriorityQueue<Integer> minHeap1 = new PriorityQueue<>(3,(o1,o2)->o1-o2);

    }


    public static void main5(String[] args) {
        //有返回值 无参数
        NoParameterReturn noparameterReturn = ()->{return 10;};
        int ret = noparameterReturn.test();
        System.out.println(ret);

        //可以简写
        NoParameterReturn noparameterReturn1 = ()-> 10;
        int ret1 = noparameterReturn1.test();
        System.out.println(ret);

        OneParameterReturn oneParameterReturn = a->a+11;
        System.out.println(oneParameterReturn.test(10));

        MoreParameterReturn moreParameterReturn = (a,b)->a+b;
        System.out.println(moreParameterReturn.test(1,2));
    }

    //多个参数 无返回值
    public static void main4(String[] args) {
        //多个参数  无返回值   a b 类型相同 都是int  可以省略
        MoreParameterNoReturn moreParameterNoReturn = (int a,int b)-> System.out.println(a+b);
        moreParameterNoReturn.test(10,20);
    }


    public static void main3(String[] args) {
        //只有一个参数  小括号可以省略   只打印一条  花括号可以省略
        OneParameterNoReturn parameterNoReturn = (a)-> {System.out.println(a);};
        parameterNoReturn.test(10);
    }

    //lambda  表达式做法
    public static void main2(String[] args) {
        //相当于（）代表匿名函数
        NoParameterNoReturn parameterNoReturn = () -> System.out.println("重写方法！");
        //上面简化了   这里同样可以调用
        parameterNoReturn.test();
    }

    public static void main1(String[] args) {
        //相当于有一个类  实现了接口并且重写了test方法
        //new  接口   重写test
        NoParameterNoReturn parameterNoReturn = new NoParameterNoReturn() {  //接受一下
            @Override
            public void test() {
                System.out.println("重写方法！");
            }
        };
        parameterNoReturn.test();
    }
}
